Analyse Mondiale des Suicides

Étude des Tendances et Facteurs de Risque (1980-2015)

Jaouadi Amani

Analyse Mondiale des Suicides


“Près de 727.000 personnes meurent par suicide chaque année dans le monde selon l’OMS.”

— Organisation Mondiale de la Santé.

Problématique

  • -727 000 décès par suicide chaque année dans le monde.
  • -Une mort toutes les 40 secondes.


Quels sont les facteurs démographiques, temporels et géographiques associés au suicide à l’échelle mondiale ?

Objectifs de l’Étude

Analyser

  • Tendances temporelles (1980-2015).
  • Différences par sexe.
  • Profils par tranche d’âge.
  • Disparités géographiques.

Identifier

  • Groupes à risque.
  • Périodes critiques.
  • Pays les plus touchés.

📁 Données Initiales

Présentation du Dataset

glimpse(data)
Rows: 43,776
Columns: 6
$ country     <chr> "Albania", "Albania", "Albania", "Albania", "Albania", "Al…
$ year        <dbl> 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985…
$ sex         <chr> "female", "female", "female", "female", "female", "female"…
$ age         <chr> "15-24 years", "25-34 years", "35-54 years", "5-14 years",…
$ suicides_no <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ population  <dbl> 277900, 246800, 267500, 298300, 138700, 34200, 301400, 264…

Statistiques Descriptives Initiales

📊 Afficher le code
# Résumé des variables
data %>% 
  summarise(
    Observations = n(),
    Pays = n_distinct(country),
    Années = paste(min(year), "-", max(year)),
    `Total suicides` = sum(suicides_no, na.rm = TRUE),
    `NA suicides` = sum(is.na(suicides_no)),
    `NA population` = sum(is.na(population))
  ) %>% 
  mutate(across(everything(), as.character)) %>% 
  pivot_longer(
    everything(),
    names_to = "Indicateur",
    values_to = "Valeur"
  ) %>% 
  kable(caption = "Résumé du dataset initial")
Résumé du dataset initial
Indicateur Valeur
Observations 43776
Pays 141
Années 1979 - 2016
Total suicides 8026455
NA suicides 2256
NA population 5460

Valeurs Manquantes

📊 Afficher le code
# Visualisation des valeurs manquantes
data %>% 
  summarise(across(everything(), ~sum(is.na(.)))) %>% 
  pivot_longer(everything(), names_to = "Variable", values_to = "NA_count") %>% 
  mutate(Pourcentage = NA_count / nrow(data) * 100) %>% 
  ggplot(aes(x = reorder(Variable, Pourcentage), y = Pourcentage)) +
  geom_col(fill = "#F44336", alpha = 0.8) +
  geom_text(aes(label = paste0(round(Pourcentage, 2), "%")), 
            hjust = -0.2, size = 4) +
  coord_flip() +
  labs(title = "Pourcentage de valeurs manquantes par variable",
       x = "Variable",
       y = "% de valeurs manquantes") +
  theme_minimal(base_size = 14)

🧹 Nettoyage des Données

Stratégie de Nettoyage

  1. -Suppression des valeurs manquantes dans suicides_no et population.
  2. -Élimination des doublons.
  3. -Conversion des variables catégorielles en facteurs ordonnés.
  4. -Création de variables dérivées (taux, décennies).
  5. -Détection des valeurs aberrantes (méthode IQR).

Impact du Nettoyage

📊 Afficher le code
# Comparaison avant/après
tibble(
  Étape = c("Données initiales", "Après nettoyage", "Supprimées"),
  `Nombre de lignes` = c(
    nrow(data),
    nrow(data_clean),
    nrow(data) - nrow(data_clean)
  ),
  `Pourcentage` = c(
    100,
    round(nrow(data_clean) / nrow(data) * 100, 2),
    round((nrow(data) - nrow(data_clean)) / nrow(data) * 100, 2)
  )
) %>% 
  kable(format.args = list(big.mark = " "),
        caption = "Impact du nettoyage sur le dataset")
Impact du nettoyage sur le dataset
Étape Nombre de lignes Pourcentage
Données initiales 43 776 100.00
Après nettoyage 36 060 82.37
Supprimées 7 716 17.63

📈 Analyse Temporelle

Évolution Globale (1980-2015)

📊 Afficher le code
trend_yearly <- data_clean %>% 
  group_by(year) %>% 
  summarise(
    total_suicides = sum(suicides_no),
    total_population = sum(population),
    taux_moyen = (total_suicides / total_population) * 100000,
    .groups = "drop"
  )

p <- ggplot(trend_yearly, aes(x = year, y = taux_moyen)) +
  geom_area(fill = "#F44336", alpha = 0.3) +
  geom_line(color = "#C62828", size = 1.5) +
  geom_point(color = "#C62828", size = 3) +
  scale_x_continuous(breaks = seq(1980, 2015, 5)) +
  labs(title = "Évolution du taux de suicide mondial (1980-2015)",
       subtitle = "Pour 100 000 habitants",
       x = "Année",
       y = "Taux pour 100k habitants") +
  theme_minimal(base_size = 14) +
  theme(plot.title = element_text(face = "bold", size = 16))

ggplotly(p) %>% 
  layout(hovermode = "x unified")

Variations Annuelles

📊 Afficher le code
trend_yearly <- trend_yearly %>% 
  mutate(variation_pct = (total_suicides - lag(total_suicides)) / lag(total_suicides) * 100)

ggplot(trend_yearly %>% filter(!is.na(variation_pct)), 
       aes(x = year, y = variation_pct)) +
  geom_col(aes(fill = variation_pct > 0), alpha = 0.8) +
  geom_hline(yintercept = 0, linetype = "dashed", size = 1) +
  scale_fill_manual(values = c("TRUE" = "#F44336", "FALSE" = "#4CAF50"),
                    labels = c("Augmentation", "Diminution")) +
  scale_x_continuous(breaks = seq(1980, 2015, 5)) +
  labs(title = "Variation annuelle du nombre de suicides",
       subtitle = "Taux de croissance par rapport à l'année précédente",
       x = "Année",
       y = "Variation (%)",
       fill = "Type") +
  theme_minimal(base_size = 14)

Comparaison par Décennie

📊 Afficher le code
data_clean %>% 
  group_by(decennie) %>% 
  summarise(
    total = sum(suicides_no),
    taux = (sum(suicides_no) / sum(population)) * 100000,
    .groups = "drop"
  ) %>% 
  ggplot(aes(x = decennie, y = taux, fill = decennie)) +
  geom_col(alpha = 0.8, width = 0.7) +
  geom_text(aes(label = round(taux, 1)), vjust = -0.5, size = 5, fontface = "bold") +
  scale_fill_brewer(palette = "Set2") +
  labs(title = "Taux de suicide par décennie",
       x = "Décennie",
       y = "Taux pour 100k habitants") +
  theme_minimal(base_size = 14) +
  theme(legend.position = "none",
        plot.title = element_text(face = "bold", size = 16))

👥 Analyse par Sexe

Répartition Globale

📊 Afficher le code
data_clean %>% 
  group_by(sex) %>% 
  summarise(total = sum(suicides_no), .groups = "drop") %>% 
  mutate(pourcentage = total / sum(total) * 100) %>% 
  ggplot(aes(x = "", y = total, fill = sex)) +
  geom_col(width = 1, color = "white", size = 2) +
  coord_polar(theta = "y") +
  geom_text(aes(label = paste0(round(pourcentage, 1), "%\n", 
                                format(total, big.mark = " "))),
            position = position_stack(vjust = 0.5),
            size = 7, fontface = "bold", color = "white") +
  scale_fill_manual(values = c("Homme" = "#2196F3", "Femme" = "#E91E63")) +
  labs(title = "Répartition des suicides par sexe (1980-2015)",
       fill = "Sexe") +
  theme_void(base_size = 14) +
  theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
        legend.position = "bottom")

Évolution par Sexe - Interactif

📊 Afficher le code
sex_trend <- data_clean %>% 
  group_by(year, sex) %>% 
  summarise(
    total_suicides = sum(suicides_no),
    total_population = sum(population),
    taux = (total_suicides / total_population) * 100000,
    .groups = "drop"
  )

p <- ggplot(sex_trend, aes(x = year, y = taux, color = sex)) +
  geom_line(size = 1.5) +
  geom_point(size = 3) +
  scale_color_manual(values = c("Homme" = "#2196F3", "Femme" = "#E91E63")) +
  scale_x_continuous(breaks = seq(1980, 2015, 5)) +
  labs(title = "Évolution du taux de suicide par sexe",
       x = "Année",
       y = "Taux pour 100k habitants",
       color = "Sexe") +
  theme_minimal(base_size = 14) +
  theme(legend.position = "top",
        plot.title = element_text(face = "bold", size = 16))

ggplotly(p)

Ratio Homme/Femme

📊 Afficher le code
trend_sex <- data_clean %>% 
  group_by(year, sex) %>% 
  summarise(total_suicides = sum(suicides_no), .groups = "drop")

ratio_temporel <- trend_sex %>% 
  pivot_wider(names_from = sex, values_from = total_suicides) %>% 
  mutate(ratio_HF = Homme / Femme)

ggplot(ratio_temporel, aes(x = year, y = ratio_HF)) +
  geom_line(color = "#9C27B0", size = 1.5) +
  geom_point(color = "#9C27B0", size = 3) +
  geom_hline(yintercept = mean(ratio_temporel$ratio_HF), 
             linetype = "dashed", color = "#F44336", size = 1) +
  annotate("text", x = 2010, y = mean(ratio_temporel$ratio_HF) + 0.15,
           label = paste("Moyenne:", round(mean(ratio_temporel$ratio_HF), 2)),
           color = "#F44336", size = 5, fontface = "bold") +
  scale_x_continuous(breaks = seq(1980, 2015, 5)) +
  labs(title = "Ratio Homme/Femme dans le temps",
       subtitle = "Nombre de suicides masculins pour 1 suicide féminin",
       x = "Année",
       y = "Ratio H/F") +
  theme_minimal(base_size = 14) +
  theme(plot.title = element_text(face = "bold", size = 16))

👶👴 Analyse par Âge

Distribution par Tranche d’Âge

📊 Afficher le code
data_clean %>% 
  group_by(age) %>% 
  summarise(total = sum(suicides_no), .groups = "drop") %>% 
  mutate(pourcentage = total / sum(total) * 100) %>% 
  ggplot(aes(x = age, y = total, fill = age)) +
  geom_col(alpha = 0.8) +
  geom_text(aes(label = paste0(round(pourcentage, 1), "%")),
            vjust = -0.5, size = 5, fontface = "bold") +
  scale_y_continuous(labels = comma) +
  scale_fill_viridis_d(option = "plasma") +
  labs(title = "Répartition des suicides par tranche d'âge",
       subtitle = "Total mondial 1980-2015",
       x = "Tranche d'âge",
       y = "Nombre de suicides") +
  theme_minimal(base_size = 14) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none",
        plot.title = element_text(face = "bold", size = 16))

Profil de Risque par Âge

📊 Afficher le code
data_clean %>% 
  group_by(age) %>% 
  summarise(taux = mean(taux_suicide_100k), .groups = "drop") %>% 
  ggplot(aes(x = age, y = taux, group = 1)) +
  geom_line(color = "#F44336", size = 2) +
  geom_point(size = 5, color = "#F44336") +
  geom_area(alpha = 0.3, fill = "#F44336") +
  labs(title = "Profil du risque suicidaire par âge",
       subtitle = "Taux moyen pour 100 000 habitants",
       x = "Tranche d'âge",
       y = "Taux pour 100k habitants") +
  theme_minimal(base_size = 14) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(face = "bold", size = 16))

Interaction Âge × Sexe

📊 Afficher le code
data_clean %>% 
  group_by(age, sex) %>% 
  summarise(taux = mean(taux_suicide_100k), .groups = "drop") %>% 
  ggplot(aes(x = sex, y = age, fill = taux)) +
  geom_tile(color = "white", size = 2) +
  geom_text(aes(label = round(taux, 1)), 
            color = "white", fontface = "bold", size = 6) +
  scale_fill_gradient2(low = "#2196F3", mid = "#FFC107", high = "#F44336",
                       midpoint = 25) +
  labs(title = "Taux moyen de suicide : Âge × Sexe",
       x = "Sexe",
       y = "Tranche d'âge",
       fill = "Taux (100k)") +
  theme_minimal(base_size = 14) +
  theme(plot.title = element_text(face = "bold", size = 16))

🌍 Analyse Géographique

Top 15 Pays - Interactif

📊 Afficher le code
top15_pays <- data_clean %>% 
  group_by(country) %>% 
  summarise(
    total_suicides = sum(suicides_no),
    total_population = sum(population),
    taux_moyen = (total_suicides / total_population) * 100000,
    .groups = "drop"
  ) %>% 
  arrange(desc(taux_moyen)) %>% 
  head(15)

p <- ggplot(top15_pays, aes(x = reorder(country, taux_moyen), y = taux_moyen, 
                            text = paste0(country, "<br>Taux: ", round(taux_moyen, 1)))) +
  geom_segment(aes(x = reorder(country, taux_moyen), 
                   xend = reorder(country, taux_moyen),
                   y = 0, yend = taux_moyen),
               color = "grey50", size = 1.2) +
  geom_point(size = 5, color = "#F44336") +
  coord_flip() +
  labs(title = "Top 15 des pays avec les taux de suicide les plus élevés",
       subtitle = "Taux moyen 1980-2015 pour 100 000 habitants",
       x = NULL,
       y = "Taux pour 100k habitants") +
  theme_minimal(base_size = 14) +
  theme(plot.title = element_text(face = "bold", size = 16))

ggplotly(p, tooltip = "text")

Analyse par Région

📊 Afficher le code
data_regions <- data_clean %>% 
  mutate(
    region = case_when(
      country %in% c("France", "Germany", "United Kingdom", "Italy", "Spain", 
                     "Poland", "Netherlands", "Belgium", "Austria", "Switzerland") ~ "Europe Ouest",
      country %in% c("Russia", "Ukraine", "Belarus", "Hungary", "Lithuania") ~ "Europe Est",
      country %in% c("United States", "Canada", "Mexico") ~ "Amérique Nord",
      country %in% c("Brazil", "Argentina", "Chile", "Colombia") ~ "Amérique Sud",
      country %in% c("China", "Japan", "South Korea", "Thailand") ~ "Asie",
      country %in% c("Australia", "New Zealand") ~ "Océanie",
      TRUE ~ "Autre"
    )
  )

data_regions %>% 
  group_by(region) %>% 
  summarise(
    taux_moyen = (sum(suicides_no) / sum(population)) * 100000,
    .groups = "drop"
  ) %>% 
  ggplot(aes(x = reorder(region, taux_moyen), y = taux_moyen, fill = region)) +
  geom_col(alpha = 0.8) +
  geom_text(aes(label = round(taux_moyen, 1)), 
            hjust = -0.2, size = 5, fontface = "bold") +
  coord_flip() +
  scale_fill_brewer(palette = "Set3") +
  labs(title = "Taux de suicide moyen par région du monde",
       x = NULL,
       y = "Taux pour 100k habitants") +
  theme_minimal(base_size = 14) +
  theme(legend.position = "none",
        plot.title = element_text(face = "bold", size = 16))

💡 Conclusions et Synthèse

🔹 Principaux Constats

  • Sexe masculin : 3 à 4 fois plus touché que les femmes.
  • Âge avancé : Seniors (55+) à risque élevé.
  • Disparités géographiques : Europe de l’Est plus concernée.
  • Variations temporelles : Périodes de crise (années 80-90) ; baisse globale post-2000.

🔹 Implications pour la Santé Publique

  1. Prévention ciblée : Adapter les stratégies aux groupes à risque.
  2. Surveillance renforcée : Améliorer la collecte de données.
  3. Politiques efficaces : S’inspirer des pays ayant réduit les taux.

🔹 Limites et Perspectives

  • Facteurs socio-économiques non inclus.
  • Perspectives : Analyse des facteurs socio-économiques, impact des politiques, modélisation prédictive.

“La prévention du suicide est l’affaire de tous”


📧 Contact : amani.jaouadi@polytechnicien.tn
🌐 GitHub : https://github.com/amenijawadi